import time
from concurrent.futures import ThreadPoolExecutor

import grpc

import demo_pb2
import demo_pb2_grpc


# rpc接口定义中服务对应成Python的类
class UserInfoService(demo_pb2_grpc.UserInfoSystemServicer):
    # 在接口定义的同名方法中补全，被调用时应该执行的逻辑
    def user_info(self, request, context):
        # request是调用的请求数据对象
        user_id = request.user_id

        response = demo_pb2.UserInfoResponse()
        response.name = '陈奕歌'
        response.age = 25

        skill_temp = []
        skill = demo_pb2.Skill()
        skill.sk_name = '唱歌'
        skill.sk_level = '等级1'
        skill_temp.append(skill)
        skill.sk_name = '跳舞'
        skill.sk_level = '等级3'
        skill_temp.append(skill)
        response.skill.extend(skill_temp)

        # 最终要返回一个调用结果
        return response


def serve():
    """
    rpc服务端启动方法
    """
    # 创建一个rpc服务器
    server = grpc.server(ThreadPoolExecutor(max_workers=10))

    # 向服务器中添加被调用的服务方法
    demo_pb2_grpc.add_UserInfoSystemServicer_to_server(UserInfoService(), server)

    # 微服务器绑定ip地址和端口
    server.add_insecure_port('127.0.0.1:8888')

    # 启动rpc服务
    server.start()

    # start()不会阻塞，此处需要加上循环睡眠 防止程序退出
    while True:
        time.sleep(10)


if __name__ == '__main__':
    serve()
